#include "comm.h"
#include "shell_port.h"




//// 全局变量
//uint8_t rx_buffer[RX_BUFFER_SIZE] = {0};
//uint8_t frame_buffer[MAX_FRAME_SIZE] = {0};
//volatile uint16_t frame_length = 0;
//volatile uint8_t frame_ready = 0;

//uint16_t dma_last_pos = 0;
//uint16_t data_start_index = 0;  // 当前帧数据起始位置

//// 帧状态
//typedef enum {
//  FRAME_STATE_IDLE,
//  FRAME_STATE_HEADER_1,
//  FRAME_STATE_HEADER_2,
//  FRAME_STATE_HEADER_3,
//  FRAME_STATE_DATA,
//  FRAME_STATE_FOOTER_1,
//  FRAME_STATE_FOOTER_2,
//  FRAME_STATE_FOOTER_3,

//} FrameState;

//FrameState frame_state = FRAME_STATE_IDLE;


//void comm_init(void)
//{

//	HAL_UART_Receive_DMA(&huart3, rx_buffer, RX_BUFFER_SIZE);
//	__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);  // 使能空闲中断
//}


//// 空闲中断处理函数
//void UART_IdleHandler(UART_HandleTypeDef *huart)
//{
//  if(huart->Instance == USART1)
//  {
//    __HAL_UART_CLEAR_IDLEFLAG(huart); // 清除空闲中断标志
//    
//    // 计算接收到的数据长度
//    uint16_t dma_current_pos = RX_BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart->hdmarx);
//    uint16_t data_length;
//    
//    if(dma_current_pos >= dma_last_pos)
//    {
//      data_length = dma_current_pos - dma_last_pos;
//    }
//    else
//    {
//      data_length = RX_BUFFER_SIZE - dma_last_pos + dma_current_pos;
//    }
//    
//    // 处理接收到的数据
//    if(data_length > 0)
//    {
//      ProcessReceivedData(dma_last_pos, data_length);
//    }
//    
//    dma_last_pos = dma_current_pos;
//  }
//}

//// 处理接收到的数据
//void ProcessReceivedData(uint16_t start_index, uint16_t length)
//{
//  for(uint16_t i = 0; i < length; i++)
//  {
//    // 计算实际缓冲区索引（处理环形缓冲区）
//    uint16_t buffer_index = (start_index + i) % RX_BUFFER_SIZE;
//    uint8_t data_byte = rx_buffer[buffer_index];
//    
//    // 状态机处理每个字节
//    switch(frame_state)
//    {
//      case FRAME_STATE_IDLE:
//        if(data_byte == FRAME_HEADER_1)
//        {
//          frame_state = FRAME_STATE_HEADER_1;
//          data_start_index = buffer_index;  // 记录帧起始位置
//          frame_length = 1;  // 重置帧长度计数器
//        }
//        break;
//        
//      case FRAME_STATE_HEADER_1:
//        if(data_byte == FRAME_HEADER_2)
//        {
//          frame_state = FRAME_STATE_HEADER_2;
//          frame_length++;
//        }
//        else
//        {
//          frame_state = FRAME_STATE_IDLE;
//        }
//        break;
//        
//      case FRAME_STATE_HEADER_2:
//        if(data_byte == FRAME_HEADER_3)
//        {
//          frame_state = FRAME_STATE_HEADER_3;
//          frame_length++;
//        }
//        else
//        {
//          frame_state = FRAME_STATE_IDLE;
//        }
//        break;
//        
//      case FRAME_STATE_HEADER_3:
//        if(data_byte == FRAME_HEADER_4)
//        {
//          frame_state = FRAME_STATE_DATA;
//          frame_length++;
//        }
//        else
//        {
//          frame_state = FRAME_STATE_IDLE;
//        }
//        break;
//        
//      case FRAME_STATE_DATA:
//        // 检查是否超过最大帧长度
//        if(frame_length >= MAX_FRAME_SIZE)
//        {
//          frame_state = FRAME_STATE_IDLE;
//          break;
//        }
//        
//        // 检查是否是帧尾开始
//        if(data_byte == FRAME_FOOTER_1)
//        {
//          frame_state = FRAME_STATE_FOOTER_1;
//        }
//        
//        frame_length++;
//        break;
//        
//      case FRAME_STATE_FOOTER_1:
//        if(data_byte == FRAME_FOOTER_2)
//        {
//          frame_state = FRAME_STATE_FOOTER_2;
//        }
//        else
//        {
//          frame_state = FRAME_STATE_DATA;  // 回到数据状态
//        }
//        frame_length++;
//        break;
//        
//      case FRAME_STATE_FOOTER_2:
//        if(data_byte == FRAME_FOOTER_3)
//        {
//          frame_state = FRAME_STATE_FOOTER_3;
//        }
//        else
//        {
//          frame_state = FRAME_STATE_DATA;  // 回到数据状态
//        }
//        frame_length++;
//        break;
//        
//      case FRAME_STATE_FOOTER_3:
//        if(data_byte == FRAME_FOOTER_4)
//        {
//          // 完整帧接收完成
//          ExtractFrame(data_start_index, frame_length);
//          frame_state = FRAME_STATE_IDLE;
//        }
//        else
//        {
//          frame_state = FRAME_STATE_DATA;  // 回到数据状态
//        }
//        frame_length++;
//        break;
//    }
//  }
//}
//// 提取完整帧到帧缓冲区
//void ExtractFrame(uint16_t start_index, uint16_t length)
//{
//  // 确保帧长度不超过最大限制
//  if(length > MAX_FRAME_SIZE) 
//  {
//    length = MAX_FRAME_SIZE;
//  }
//  
//  // 复制帧数据到帧缓冲区
//  for(uint16_t i = 0; i < length; i++)
//  {
//    uint16_t buffer_index = (start_index + i) % RX_BUFFER_SIZE;
//    frame_buffer[i] = rx_buffer[buffer_index];
//  }
//  
//  // 设置帧就绪标志
//  frame_ready = 1;
//  frame_length = length;
//}

//// 处理完整帧
//void ProcessFrame(uint8_t *frame, uint16_t length)
//{
//  // 示例：通过串口发送接收到的帧
//  HAL_UART_Transmit(&huart3, (uint8_t*)"Frame received: ", 16, 100);
//  
//  // 发送帧内容（十六进制格式）
//  for(uint16_t i = 0; i < length; i++)
//  {
//    uint8_t hex_buf[3];
//    sprintf((char*)hex_buf, "%02X ", frame[i]);
//    HAL_UART_Transmit(&huart3, hex_buf, 3, 100);
//  }
//  HAL_UART_Transmit(&huart3, (uint8_t*)"\r\n", 2, 100);
//  
//  // 这里可以添加具体的帧解析逻辑
//  // 例如：检查帧长度、校验和、执行指令等
//  
//  // 示例：如果帧包含LED控制指令
//  if(length >= 10 && frame[4] == 0xFF)  // 假设第5字节是指令类型
//  {
//    if(frame[5] == 0xA1)  // 开灯
//    {
//      bsp_LedOn(2);
//      HAL_UART_Transmit(&huart3, (uint8_t*)"LED ON\r\n", 8, 100);
//    }
//    else if(frame[5] == 0xA2)  // 关灯
//    {
//      bsp_LedOff(2);
//      HAL_UART_Transmit(&huart3, (uint8_t*)"LED OFF\r\n", 9, 100);
//    }
//  }
//}

